Curso de ScriptVox Intermedirio - Aula 4 - Prof. Oswaldo Vernet - iNCE/UFRJ



Na aula passada, aprendemos a criar nossas prprias funes, que podem receber

parmetros, retornar valores e manipular variveis locais. Nesta quarta aula,

vamos introduzir, atravs de exemplos, o conceito de ESCOPO, que se aplica, 

em princpio, a variveis e rtulos. 



Execute todos os scripts apresentados neste texto no ScriptVox verso 6.0,

analise atentamente o que acontecer e v respondendo ao que for perguntado.



Primeiro script:



* incio do primeiro script

frase := "Boa noite"

teste ("Ol", 3)

escreve "A varivel frase armazena o valor " frase

termina



funo teste (frase, vezes) : contador

repete contador vezes

escreve frase

fim repete

fim funo

* fim do primeiro script



Perguntas sobre o primeiro script:

1)  Quantas vezes o comando ESCREVE, interno ao bloco do comando REPETE  executado?

    Que varivel determina esta quantidade de vezes? Que cadeia  escrita na tela

    por este comando.  

2)  Como voc chamaria a funo "teste" para escrever dez vezes a cadeia "Socorro!" ?

3)  Que cadeia  escrita na tela pelo comando ESCREVE que est na linha seguinte 

     linha onde a funo "teste"  chamada?

4)  H uma varivel global chamada "frase" e o nome da varivel que guarda o primeiro

    parmetro para a funo "teste" tambm  frase. So a mesma varivel ou elas tm

    apenas o mesmo nome? Justifique.

5)  Enquanto a funo "teste" est sendo executada, o nome "frase" se refere a qual

    das duas variveis?

6)  Antes de chamar a funo "teste", houve uma atribuio  varivel global "frase".

    Que valor foi atribudo?

7)  Este valor mudou aps a chamada da funo "teste" ?

8)  A funo teste retorna algum valor ?



Moral da histria: se tivermos um parmetro com o mesmo nome de uma varivel global

e usarmos o nome dessa varivel dentro da funo, estaremos nos referindo ao parmetro

e no  varivel global.  como se, temporariamente, essa varivel global fosse esquecida

enquanto a funo est sendo executada. Mas quando a funo termina, a varivel global est

l, intacta, com o mesmo valor que possua antes da chamada.



Vamos ao segundo script:



* incio do segundo script

frase := "Bom dia"

teste ()

escreve frase

termina



funo teste ()

escreve frase

frase := "Boa noite"

fim funo

* fim do segundo script 



Perguntas sobre o segundo script:



1) O que  escrito na tela durante a execuo do script?

2) A funo "teste" recebe algum parmetro?  Ela retorna algum valor?

3) Durante a execuo do comando "escreve frase", que pertence ao bloco 

   da funo "teste", qual o valor da varivel frase ?

4) Durante a execuo do comando "escreve frase", fora da funo "teste",

   qual o valor da varivel "frase"?  Onde ele foi mudado?



Moral da histria: Uma varivel global pode ser usada ou modificada no bloco

de uma funo, desde que no haja um parmetro ou uma varivel local  funo

com o mesmo nome da varivel global.



Vamos ao terceiro script:



* incio do terceiro script

frase := teste ()

escreve frase



funo teste () : frase

frase := "Uma frase curta"

escreve frase

frase := "Uma frase longa"

retorna frase

fim funo

* fim do terceiro script



1)  A funo "teste" recebe algum parmetro?  Ela possui variveis locais?  Quais?

    Ela retorna algum valor?  Qual?  Em que momento (linha) este valor  retornado?

2)  O que faz exatamente a primeira atribuio do script "frase := teste()" ?

    Explique passo a passo o seu funcionamento.

3)  No comando "escreve frase", pertencente ao bloco da funo "teste", a qual

    varivel "frase" estamos nos referindo:  varivel global ou  varivel local?

4)  No comando "frase := teste()", que  a primeira atribuio do script, a qual

    varivel "frase" estamos nos referindo:  varivel global ou  varivel local?

5)  A atribuio frase := "Uma frase longa", no bloco da funo "teste" ir modificar

    o valor da varivel frase local ou da varivel frase global?

6)  O comando retorna frase, na ltima linha do bloco da funo "teste", ir retornar

    que cadeia?  Esta cadeia ser atribuda a qual varivel?



Moral da histria: Atravs do comando RETORNA, podemos modificar indiretamente uma

varivel global, atribuindo a ela o valor retornado por uma funo.



A palavra ESCOPO quer dizer alcance, amplitude e, em linguagens de programao, significa 

exatamente em que pontos do programa uma varivel pode ser usada.



Uma varivel local, portanto, tem seu escopo restrito  funo onde ela 

declarada. Ela s pode ser usada no bloco desta funo. O mesmo acontece com uma

varivel que armazena um parmetro passado para funo. 



J uma varivel global, como o prprio nome diz,  visvel em todo o script,

seu valor pode ser usado em qualquer lugar. Mas se houver uma varivel local ou

parmetro com o mesmo nome da varivel global, a global fica temporariamente inacessvel

no bloco da funo e, assim que a funo termina, a varivel global volta a ser

visvel. Chamamos isto de SOMBREAMENTO de uma varivel global por uma varivel local.



O escopo tambm funciona para os rtulos. Quando um rtulo  definido dentro do

bloco de uma funo, qualquer comando "desvia" para este rtulo tem que pertencer

ao bloco da funo. Em outras palavras: no  possvel desviar de uma linha

do script fora do bloco de uma funo para um rtulo definido no bloco da funo.

O contrrio tambm no  permitido: um comando desvia pertencente ao bloco de

uma funo no pode desviar para um rtulo situado fora da funo. Ou seja,

no  possvel, atravs de um comando Desvia, desviar para dentro ou para fora

de uma funo.



Apesar de ser possvel ter variveis globais e locais com o mesmo nome, no 

aconselhvel adotar esta prtica, pois ela s prejudica a legibilidade do programa.

Portanto, aqui no nosso curso, vamos sempre procurar batizar as variveis com

nomes diferentes, de modo a evitar confuses. Afinal de contas, h tantos nomes

que podemos inventar para as variveis! Para que repetir?



Exerccios de programao (use e abuse de variveis locais, sempre que apropriado):



1)  Escreva a funo "conta_brancos", que recebe como parmetro uma cadeia de caracteres e retorna

    quantas vezes o caractere branco ocorre na cadeia. Teste sua funo com os seguintes

    comandos:



    escreve conta_brancos ("Uma pequena frase")

    escreve conta_brancos ("Uma frase enorme, cheia de letras e que no diz nada")



2)  Generalize a funo "conta_brancos", chamando-a de "conta_caracteres". Esta nova funo receber

    dois parmetros: uma cadeia e um caractere. A funo deve retornar o nmero de ocorrncias do 

    caractere na cadeia.  Teste com os seguintes comandos:



    escreve conta_caracteres ("Quero ver contar qualquer caractere", "a")

    escreve conta_caracteres ("xxxyyyyyyyyyyzyzyzyz", "y")



3)  Escreva a funo "repete_caracteres", que recebe como parmetro um nmero inteiro e um caractere 

    e retorna uma cadeia onde o caractere  repetido tantas vezes quanto o nmero inteiro que foi passado.

    Assim:



    escreve repete_caractere (5, "b")



    dever escrever na tela a cadeia "bbbbb".



Ateno em todos os exerccios para um detalhe: em ScriptVox, quando nos referimos a um caractere,

queremos dizer, na verdade, uma cadeia unitria, formada por apenas um caractere. 





Exerccio de avaliao (enviar para scriptvox@gmail.com at o meio-dia de 30 de janeiro de 2012)



Escreva uma funo (pode escolher o nome) que recebe dois parmetros: o nome de um arquivo a ser lido

e o nome de um arquivo a ser criado. A funo dever ler o primeiro arquivo e

transcrever todas as suas linhas convertidas para maisculas no segundo arquivo

e retornar o nmero de linhas que foram processadas.



Faa tambm o programa principal que pergunta ao usurio e l do teclado os nomes dos arquivos, 

chama a sua funo e, para finalizar, escreve uma mensagem de despedida informando o nmero

de linhas.



No precisa mais avisar que a extenso agora  ".PRO", certo?

    

Bom estudo!



Oswaldo Vernet















